home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1999 May: Tool Chest / Developer CD Series Tool Chest (Apple Computer)(May 1999).iso / Tool Chest / Development Kits / HyperCard Related / XCMDs & XFCNs / Byrne's XCMDs&XFCNs / Source / AddTimes.c next >
Encoding:
C/C++ Source or Header  |  1991-04-01  |  4.6 KB  |  186 lines  |  [TEXT/MPS ]

  1. /*
  2.     AddTimes XFCN v1.1
  3.     
  4.     ©1991 Apple Computer, Inc.; by Mike Byrne
  5.     
  6.     Takes two times (strings of the form "mm,ss,bb") and adds them, returning a string of the form "mm,ss,bb".
  7.     
  8.     Form:
  9.     AddTimes <time1>, <time2>
  10.     
  11.     # the MPW 3.2 build commands:
  12.     C -b AddTimes.c -mbg off
  13.         Link -w -t STAK -c WILD -rt XFCN=701 ∂
  14.             -m ENTRYPOINT ∂
  15.             -sg AddTimes ∂
  16.             AddTimes.c.o ∂
  17.             "{Libraries}HyperXLib.o" ∂
  18.             "{Libraries}Runtime.o" ∂
  19.             "{Libraries}Interface.o" ∂
  20.             "{CLibraries}StdCLib.o" ∂
  21.             -o "teststack"
  22. */
  23.  
  24. #include <Types.h>
  25. #include <string.h>
  26. #include <Memory.h>
  27. #include "HyperXcmd.h"
  28.  
  29. #define NULL (long) 0
  30. #define NIL (long) 0
  31.  
  32. #define kNumParams     2
  33. #define    blocksInSec 75
  34. #define secsInMin    60
  35.  
  36.  
  37. /* prototypes */
  38. void ErrorBack(XCmdPtr paramPtr, char *message);
  39. void MoveLockParams ( XCmdPtr paramPtr, short paramCount );
  40. void UnlockParams  ( XCmdPtr paramPtr, short paramCount );
  41. void StringToInts( char* theString, long* mint, long* sint, long* bint);
  42. void IntsToString(char* retString, long mint, long sint, long bint);
  43.  
  44. pascal void EntryPoint(XCmdPtr paramPtr)
  45. {
  46.  
  47.     /* variable declarations */
  48.     long    mint1, sint1, bint1;
  49.     long    mint2, sint2, bint2;
  50.     long    mintr, sintr, bintr;
  51.     long    carry = 0;
  52.     char    retString[10];
  53.  
  54.     /* move high and lock the parameters. */
  55.     MoveLockParams(paramPtr, paramPtr->paramCount);
  56.  
  57.     /* check for copyright or syntax help request */
  58.     if (!strcmp( (char*)*paramPtr->params[0], "!") ) {
  59.         ErrorBack(paramPtr, "v1.1, ©1991 Apple Computer, Inc.; by Mike Byrne");
  60.         UnlockParams(paramPtr, paramPtr->paramCount);
  61.         return;
  62.     } else if (!strcmp ( (char*)*paramPtr->params[0], "?") ) {
  63.         ErrorBack(paramPtr, "AddTimes syntax is 'AddTimes <time1>, <time2>'");
  64.         UnlockParams(paramPtr, paramPtr->paramCount);
  65.         return;
  66.     }
  67.  
  68.     /* not a copyright or help request.       */     
  69.     /* check for correct number of parameters */
  70.     if (paramPtr->paramCount != kNumParams) {
  71.         ErrorBack(paramPtr, "Error: AddTimes syntax is 'AddTimes <time1>, <time2>'");
  72.         UnlockParams(paramPtr, paramPtr->paramCount);
  73.         return;
  74.     }
  75.  
  76.     /* convert the times to integers  */
  77.     StringToInts( (char*)*paramPtr->params[0], &mint1, &sint1, &bint1);
  78.     StringToInts( (char*)*paramPtr->params[1], &mint2, &sint2, &bint2);
  79.  
  80.     /* add them, with carrying */
  81.     carry = (bint1 + bint2) / blocksInSec;
  82.     bintr = (bint1 + bint2) % blocksInSec;
  83.     sintr = sint1 + sint2 + carry;
  84.     carry = sintr / secsInMin;
  85.     sintr = sintr % secsInMin;
  86.     mintr = mint1 + mint2 + carry;
  87.     
  88.     /* convert the numbers back to a string and go home */
  89.     IntsToString(retString, mintr, sintr, bintr);
  90.     ErrorBack(paramPtr, retString);
  91.     UnlockParams(paramPtr, paramPtr->paramCount);
  92.     return;
  93.     
  94. }
  95.  
  96.  
  97.  
  98. /* convert a string of the form "mm,ss,bb" to three longs 
  99.    ------------------------------------------------------- */
  100. void StringToInts( char* theString, long* mint, long* sint, long* bint)
  101. {
  102.     char*    mptr;
  103.     char*    sptr;
  104.     char*    bptr;
  105.     char    mstr[5], sstr[5], bstr[5];
  106.     
  107.     mptr = strtok(theString, ",");
  108.     sptr = strtok(NULL, ",");
  109.     bptr = strtok(NULL, ",");
  110.     strcpy(mstr, mptr);
  111.     strcpy(sstr, sptr);
  112.     strcpy(bstr, bptr);
  113.     c2pstr(mstr);
  114.     c2pstr(sstr);
  115.     c2pstr(bstr);
  116.     StringToNum(mstr, mint);
  117.     StringToNum(sstr, sint);
  118.     StringToNum(bstr, bint);
  119. }
  120.  
  121.  
  122.  
  123. /* convert three integers to a c string of the form "mm,ss,bb" 
  124.    ----------------------------------------------------------- */
  125. void IntsToString(char* retString, long mint, long sint, long bint)
  126. {
  127.     Str255     mstr, sstr, bstr;
  128.     
  129.     NumToString(mint, mstr);
  130.     NumToString(sint, sstr);
  131.     NumToString(bint, bstr);
  132.     p2cstr(mstr);
  133.     p2cstr(sstr);
  134.     p2cstr(bstr);
  135.     strcpy(retString, mstr);
  136.     strcat(retString, ",");
  137.     strcat(retString, sstr);
  138.     strcat(retString, ",");
  139.     strcat(retString, bstr);
  140. }
  141.  
  142.     
  143. /* allocate and load up paramPtr->returnValue with a string 
  144.    -------------------------------------------------------- */
  145. void ErrorBack(XCmdPtr paramPtr, char *message)
  146. {
  147.     Handle  mesHnd;
  148.  
  149.     /*
  150.         Allocate space for an error message.
  151.         Copy the string into it.
  152.         Return the handle to HyperCard.
  153.     */
  154.     mesHnd = NewHandle((long)(strlen(message)+1));
  155.     if (mesHnd == nil) return;
  156.     strcpy((char *)*mesHnd,message);
  157.     paramPtr->returnValue = mesHnd;
  158. }
  159.  
  160.  
  161.  
  162. /*  move high and lock down all parameters  
  163.     ----------------------------------------------------------------------- */
  164. void MoveLockParams ( XCmdPtr paramPtr, short paramCount )
  165. {
  166.     short i;
  167.     
  168.     for(i=0; i <= paramCount-1; i++)
  169.     {
  170.         MoveHHi(paramPtr->params[i]);
  171.         HLock(paramPtr->params[i]);
  172.     }
  173. }
  174.  
  175.  
  176.  
  177.  
  178. /* unlock all parameter handles in the XFCNBlock  
  179.    ---------------------------------------------  */
  180. void UnlockParams  ( XCmdPtr paramPtr, short paramCount )
  181. {    short i;
  182.     
  183.     for(i=0; i <= paramCount-1; i++)
  184.         { HUnlock(paramPtr->params[i]);}
  185. }
  186.